/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id: ConsultaDAOAdmin.java,v 1.10 
 * Universidad de los Andes (Bogot� - Colombia)
 * Departamento de Ingenier�a de Sistemas y Computaci�n 
 *
 * Ejercicio: TruequeAndes
 * Autor: Juan Diego Toro - 1-Marzo-2010
 * Ajustes: 2011
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package co.uniandes.truequeAndes.dao2;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Properties;

import co.edu.uniandes.truequeAndes.vos.CategoriasValue;
import co.edu.uniandes.truequeAndes.vos.ClientesValue;
import co.edu.uniandes.truequeAndes.vos.InformacionTablasValue;
import co.edu.uniandes.truequeAndes.vos.NumeroDeProductosPorCategoriaValue;
import co.edu.uniandes.truequeAndes.vos.ProductosConOfertasValue;
import co.edu.uniandes.truequeAndes.vos.ProductosValue;
import co.edu.uniandes.truequeAndes.vos.TablasValue;

/**
 * Clase ConsultaDAOAdmin, encargada de hacer las consultas para el administrador
 */
public class ConsultaDAOAdmin2 
{
	
	//----------------------------------------------------
	//Constantes
	//----------------------------------------------------
	/**
	 * ruta donde se encuentra el archivo de conexi�n.
	 */
	private static final String ARCHIVO_CONEXION = "/../conexion.properties";
	
	//----------------------------------------------------
	//Consultas
	//----------------------------------------------------
	

	//----------------------------------------------------
	//Atributos
	//----------------------------------------------------
	/**
	 * conexion con la base de datos
	 */
	public Connection conexion;
	
	/**
	 * nombre del usuario para conectarse a la base de datos.
	 */
	private String usuario;
	
	/**
	 * clave de conexi�n a la base de datos.
	 */
	private String clave;
	
	/**
	 * URL al cual se debe conectar para acceder a la base de datos.
	 */
	private String cadenaConexion;
	
	/**
	 * Consulta la informacion de las tablas en la base de datos
	 */
	private static final String informacionTablas = "select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_name from user_constraints";
	
	/*--------------------------------------------------------*/
	/*-------------------NOMBRES COLUMNAS---------------------*/
	/*--------------------------------------------------------*/
	
	/**
	 * REPRESENTA LA COLUMNA OWNER
	 */
	private static final String owner= "OWNER";
	/**
	 * REPRESENTA LA COLUMNA CONSTRAINT_NAME
	 */
	private static final String constraint_name= "CONSTRAINT_NAME";
	/**
	 * REPRESENTA LA COLUMNA CONSTRAINT_TYPE
	 */
	private static final String constraint_type= "CONSTRAINT_TYPE";	
	/**
	 * REPRESENTA LA COLUMNA TABLE_NAME
	 */
	private static final String table_name= "TABLE_NAME"; 
	/**
	 * REPRESENTA LA COLUMNA R_OWNER
	 */
	private static final String r_owner= "R_OWNER"; 
	/**
	 * REPRESENTA LA COLUMNA R_CONSTRAINT_NAME
	 */
	private static final String r_constraint_name= "R_CONSTRAINT_NAME";
	
	
	/**
	 * constructor de la clase. No inicializa ningun atributo.
	 */
	public ConsultaDAOAdmin2() 
	{		
		
	}
	
	// -------------------------------------------------
    // M�todos
    // -------------------------------------------------

	/**
	 * obtiene ls datos necesarios para establecer una conexion
	 * Los datos se obtienen a partir de un archivo properties.
	 * @param path ruta donde se encuentra el archivo properties.
	 */
	public void inicializar(String path)
	{
		try
		{
			File arch= new File(path+ARCHIVO_CONEXION);
			Properties prop = new Properties();
			FileInputStream in = new FileInputStream( arch );

	        prop.load( in );
	        in.close( );

			cadenaConexion = prop.getProperty("url");	// El url, el usuario y passwd deben estar en un archivo de propiedades.
												// url: "jdbc:oracle:thin:@chie.uniandes.edu.co:1521:chie10";
			usuario = prop.getProperty("s2304a38");	// "s2501aXX";
			clave = prop.getProperty("m2304a38");	// "c2501XX";
			final String driver = prop.getProperty("driver");
			Class.forName(driver);
		
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}	
	}
	/**
	 * M�todo que se encarga de crear la conexi�n con el Driver Manager
	 * a partir de los parametros recibidos.
	 * @param url direccion url de la base de datos a la cual se desea conectar
	 * @param usuario nombre del usuario que se va a conectar a la base de datos
	 * @param clave clave de acceso a la base de datos
	 * @throws SQLException si ocurre un error generando la conexi�n con la base de datos.
	 */
    private void establecerConexion(String url, String usuario, String clave) throws SQLException
    {
    	try
        {
			conexion = DriverManager.getConnection(url,usuario,clave);
        }
        catch( SQLException exception )
        {
            throw new SQLException( "ERROR: ConsultaDAO obteniendo una conexi�n." );
        }
    }
    
    /**
 	 *Cierra la conexi�n activa a la base de datos. Adem�s, con=null.
     * @param con objeto de conexi�n a la base de datos
     * @throws SistemaCinesException Si se presentan errores de conexi�n
     */
    public void closeConnection(Connection connection) throws Exception {        
		try {
			connection.close();
			connection = null;
		} catch (SQLException exception) {
			throw new Exception("ERROR: ConsultaDAO: closeConnection() = cerrando una conexi�n.");
		}
    } 
    
    // ---------------------------------------------------
    // M�todos asociados a los casos de uso: Admin Base de Datos
    // ---------------------------------------------------
    
    /**
     * M�todo que se encarga de realizar la consulta en la base de datos
     * y retorna la informaci�n de las tablas como un ArrayList de 
     * elementos tipo TablasValue.
     * @return ArrayList lista que contiene elementos tipo TablasValue
     * @throws Exception se lanza una excepci�n si ocurre un error en
     * la conexi�n o en la consulta. 
     */
    public ArrayList<InformacionTablasValue> darInformacionTablas()throws Exception
    {
    	ArrayList<InformacionTablasValue> informacionTablas = new ArrayList<InformacionTablasValue>();
		InformacionTablasValue informacionTablasValue = new InformacionTablasValue();
		
		
		PreparedStatement prepStmt = null;						
		
		try {
			prepStmt = conexion.prepareStatement(this.informacionTablas);
			
			ResultSet rs = prepStmt.executeQuery();
			

			while(rs.next()){
				String owner = rs.getString(this.owner);
				String constraint_name = rs.getString(this.constraint_name);
				String constraint_type = rs.getString(this.constraint_type);
				String table_name = rs.getString(this.table_name);
				String r_owner = rs.getString(this.r_owner);
				String r_constraint_name = rs.getString(this.r_constraint_name);
				
				informacionTablasValue.setOwner(owner);
				informacionTablasValue.setConstraint_name(constraint_name);
				informacionTablasValue.setConstraint_type(constraint_type);
				informacionTablasValue.setTable_name(table_name);
				informacionTablasValue.setR_owner(r_owner);
				informacionTablasValue.setR_constraint_name(r_constraint_name);
				
				informacionTablas.add(informacionTablasValue);
				informacionTablasValue = new InformacionTablasValue();
							
			}
		
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(this.darInformacionTablas());
			throw new Exception("ERROR = ConsultaDAO: loadRowsBy(..) Agregando parametros y executando el statement!!!");
		}finally {
			if (prepStmt != null) {
				try {
					prepStmt.close();
				} catch (SQLException exception) {
					
					throw new Exception("ERROR: ConsultaDAO: loadRow() =  cerrando una conexi�n.");
				}
			}
			
		}		
		return informacionTablas;
    }


}
